<?php
/**
 * 消息推送http
 * @param $url
 * @param $post_data
 * @return bool|string
 */
function send_post($url, $post_data) {
    $options = array(
        'http' => array(
            'method' => 'POST',
            'header' => 'Content-type:application/json',
            //header 需要设置为 JSON
            'content' => $post_data,
            'timeout' => 60,
            //超时时间
        ),
    );
    $context = stream_context_create($options);
    $result = file_get_contents($url, false, $context);
    return $result;
}
/**
 * 发起http请求
 * @param string $url 访问路径
 * @param array $params 参数，该数组多于1个，表示为POST
 * @param int $expire 请求超时时间
 * @param array $extend 请求伪造包头参数
 * @param string $hostIp HOST的地址
 * @return array    返回的为一个请求状态，一个内容
 */
function makeRequest($url, $params = array(), $expire = 0, $extend = array(), $hostIp = '') {
    if (empty($url)) {
        return array('code' => '100');
    }

    $_curl = curl_init();
    $_header = array(
        'Accept-Language: zh-CN',
        'Connection: Keep-Alive',
        'Cache-Control: no-cache',
    );
    // 方便直接访问要设置host的地址
    if (!empty($hostIp)) {
        $urlInfo = parse_url($url);
        if (empty($urlInfo['host'])) {
            $urlInfo['host'] = substr(DOMAIN, 7, -1);
            $url = "http://{$hostIp}{$url}";
        } else {
            $url = str_replace($urlInfo['host'], $hostIp, $url);
        }
        $_header[] = "Host: {$urlInfo['host']}";
    }

    // 只要第二个参数传了值之后，就是POST的
    if (!empty($params)) {
        curl_setopt($_curl, CURLOPT_POSTFIELDS, http_build_query($params));
        curl_setopt($_curl, CURLOPT_POST, true);
    }

    if (substr($url, 0, 8) == 'https://') {
        curl_setopt($_curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($_curl, CURLOPT_SSL_VERIFYHOST, false);
    }
    curl_setopt($_curl, CURLOPT_URL, $url);
    curl_setopt($_curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($_curl, CURLOPT_USERAGENT, 'API PHP CURL');
    curl_setopt($_curl, CURLOPT_HTTPHEADER, $_header);

    if ($expire > 0) {
        curl_setopt($_curl, CURLOPT_TIMEOUT, $expire); // 处理超时时间
        curl_setopt($_curl, CURLOPT_CONNECTTIMEOUT, $expire); // 建立连接超时时间
    }

    // 额外的配置
    if (!empty($extend)) {
        curl_setopt_array($_curl, $extend);
    }

    $result['result'] = curl_exec($_curl);
    $result['code'] = curl_getinfo($_curl, CURLINFO_HTTP_CODE);
    $result['info'] = curl_getinfo($_curl);
    if ($result['result'] === false) {
        $result['result'] = curl_error($_curl);
        $result['code'] = -curl_errno($_curl);
    }

    curl_close($_curl);
    return $result;
}

//二进制转图片image/png
function data_uri($contents, $mime) {
    $base64 = base64_encode($contents);
    return ('data:' . $mime . ';base64,' . $base64);
}
//订单号
function order_no($unique = 0) {
    $orderNo = date('YmdHis') . substr(microtime(), 2, 5) . mt_rand(10000, 99999);
    if (!empty($unique)) {
        $orderNo = $orderNo . $unique;
    }

    return $orderNo;
}

function fail($message, $data = [], $code = 0)
{
    \think\Db::rollback();

    $result = [
        'code' => $code,
        'data' => $data,
        'msg'  => is_array($message) ? json_encode($message) : $message,
    ];

    // 如果未设置类型则自动判断
    $type     = 'json';
    $response = \think\Response::create($result, $type, 200);

    throw new \think\exception\HttpResponseException($response);
}


function overlayQRCode($qrCodeBase64, $backgroundPath)
{
    // 1. 去掉 Base64 前缀（如果存在）
    if (strpos($qrCodeBase64, 'data:image/png;base64,') === 0) {
        $qrCodeBase64 = str_replace('data:image/png;base64,', '', $qrCodeBase64);
    }

    $qrCodeBase64 = str_replace(' ', '+', $qrCodeBase64); // 替换可能的空格
    $qrCodeData = base64_decode($qrCodeBase64); // 解码为 PNG 图像数据

    // 2. 创建 QR 码图像
    $qrImage = imagecreatefromstring($qrCodeData);
    if ($qrImage === false) {
        throw new Exception('Invalid QR Code data.');
    }

    // 3. 加载背景图
    $backgroundImage = imagecreatefrompng($backgroundPath);
    if ($backgroundImage === false) {
        throw new Exception('Could not load background image.');
    }

    // 4. 获取背景图的尺寸
    $bgWidth = imagesx($backgroundImage);
    $bgHeight = imagesy($backgroundImage);

    // 5. 获取二维码的原始尺寸
    $qrWidth = imagesx($qrImage);
    $qrHeight = imagesy($qrImage);

    // 设置缩放比例（例如：0.5 表示 50%）
    $scaleFactor = 0.8; // 根据需要调整这个值
    $newQrWidth = $qrWidth * $scaleFactor;  // 新的二维码宽度
    $newQrHeight = $qrHeight * $scaleFactor; // 新的二维码高度

    // 6. 设置二维码的位置（右下角）
    $destX = $bgWidth - $newQrWidth -800 ; // 距离右边20像素
    $destY = $bgHeight - $newQrHeight - 1150; // 距离下边20像素

    // 7. 合成图像（使用生成的新尺寸）
    imagecopyresampled(
        $backgroundImage,
        $qrImage,
        $destX,
        $destY,
        0,
        0,
        $newQrWidth,
        $newQrHeight,
        $qrWidth,
        $qrHeight
    );

    // 8. 开始输出到内存流而不是直接输出到浏览器
    ob_start(); // 启用输出缓冲
    imagepng($backgroundImage);
    $imageData = ob_get_contents(); // 获取内存中的图像数据
    ob_end_clean(); // 清理输出缓冲

    // 9. 将图像数据编码为 Base64
    $base64Image = base64_encode($imageData);

    // 10. 构建完整的 Base64 字符串
    $base64ImageWithPrefix = 'data:image/png;base64,' . $base64Image;

    // 11. 释放图像资源
    imagedestroy($backgroundImage);
    imagedestroy($qrImage);

    // 12. 返回带前缀的 Base64 编码的图像数据
    return $base64ImageWithPrefix;
}

function validateBankCard($cardNumber) {
    // 去除空格和非数字字符
    $cardNumber = preg_replace('/\D/', '', $cardNumber);

    // 检查银行卡号的长度（一般来说，银行卡号是 13 到 19 位）
    if (strlen($cardNumber) < 13 || strlen($cardNumber) > 19) {
        return false; // 长度不合法
    }

    // 使用 Luhn 算法进行验证
    $checksum = 0;
    $length = strlen($cardNumber);
    $isSecond = false;

    for ($i = $length - 1; $i >= 0; $i--) {
        $digit = (int)$cardNumber[$i];

        if ($isSecond) {
            $digit *= 2;
            if ($digit > 9) {
                $digit -= 9; // 同时实现了对大于9的数字进行减9的操作
            }
        }

        $checksum += $digit;
        $isSecond = !$isSecond; // 切换状态
    }

    // 如果总和能被10整除，则为有效银行卡号
    return ($checksum % 10 == 0);
}
